// 文件名：flat_map_config_lookup.cpp
// 目的：使用 std::flat_map 存储配置项，支持存在性检查、随机访问、以及从某前缀起的顺序遍历。
// 要点：
//   - contains(key)：O(log N) 判断是否存在；
//   - at(key)：返回只读引用（不存在会抛异常）；
//   - lower_bound("api.")：返回第一个不小于该字符串的键，便于前缀分段遍历；
//   - 顺序遍历输出从 "api." 开始的所有键值对（按字典序）。
// 性能考量：flat_map 具有优良的遍历局部性与空间效率，适合以读为主的配置读取路径。
// 注意：
//   - 若希望对 string_view 进行异构 contains/find/at，建议将比较器设为 std::less<>（透明比较器）。
//   - #include <flat_map> 依赖实现支持（C++23 或供应商扩展）。

#include <flat_map>
#include <iostream>

int main() {
    std::flat_map<std::string, std::string> config = {
        {"app.theme", "dark"},
        {"api.base_url", "https://api.example.com"},
        {"api.timeout_seconds", "30"},
        {"cache.enabled", "true"},
        {"log.level", "info"}
    };

    // 封装查询：若存在则输出值，否则标记缺失
    auto lookup = [&](std::string_view key) {
        if (config.contains(key)) {
            std::cout << key << " = " << config.at(key) << '\n';
        } else {
            std::cout << key << " (missing)\n";
        }
    };

    lookup("api.base_url");
    lookup("cache.enabled");
    lookup("feature.toggle");

    // 从 "api." 起按序遍历（字典序 >= "api." 的所有项）
    auto it = config.lower_bound("api.");
    std::cout << "Entries from \"api.\" onwards:\n";
    for (; it != config.end(); ++it) {
        std::cout << "  " << it->first << " => " << it->second << '\n';
    }

    return 0;
}